xenstored: Delay forking until after listening sockets are
authorKeir Fraser <keir.fraser@citrix.com>
Wed, 26 Mar 2008 13:21:42 +0000 (13:21 +0000)
committerKeir Fraser <keir.fraser@citrix.com>
Wed, 26 Mar 2008 13:21:42 +0000 (13:21 +0000)
opened. Also, in startup xend script, delay further startup until
xenstored initial child process has exited. This serialises xenstored
startup with that of other daemons (e.g., xenconsoled).

Signed-off-by: Bastian Blank <waldi@debian.org>
tools/misc/xend
tools/xenstore/xenstored_core.c

index 7cb617630d044f25503a16f5904d764e17d74030..15e9b8a53fed58fa8853e8f97d2e0bdff88c837f 100644 (file)
@@ -95,11 +95,17 @@ def start_xenstored():
         f.close()
     except:
         pass
-    XENSTORED_TRACE = os.getenv("XENSTORED_TRACE")
-    cmd = "xenstored --pid-file /var/run/xenstore.pid"
-    if XENSTORED_TRACE:
-        cmd += " -T /var/log/xen/xenstored-trace.log"
-    s,o = commands.getstatusoutput(cmd)
+    args = ['xenstored', "--pid-file", pidfname]
+    if os.getenv("XENSTORED_TRACE"):
+        args.extend(["-T", "/var/log/xen/xenstored-trace.log"])
+    pid = os.fork()
+    if pid == 0:
+        os.execvp('xenstored', args)
+    p, status = os.waitpid(pid, 0)
+    if os.WIFEXITED(status):
+        status = os.WEXITSTATUS(status)
+        if status:
+            raise RuntimeError("Failed to start xenstored: %d" % status)
 
 def start_consoled():
     if os.fork() == 0:
index a643f2d9690c84a41605d84827ff174b1a5411dc..37ceab8493410ea4dcfecc05f21c71d57dde915a 100644 (file)
@@ -1839,13 +1839,6 @@ int main(int argc, char *argv[])
                }
        }
 
-       if (dofork) {
-               openlog("xenstored", 0, LOG_DAEMON);
-               daemonize();
-       }
-       if (pidfile)
-               write_pidfile(pidfile);
-
        /* Talloc leak reports go to stderr, which is closed if we fork. */
        if (!dofork)
                talloc_enable_leak_report_full();
@@ -1899,16 +1892,21 @@ int main(int argc, char *argv[])
        /* Restore existing connections. */
        restore_existing_connections();
 
-       if (outputpid) {
-               printf("%ld\n", (long)getpid());
-               fflush(stdout);
-       }
-
        /* redirect to /dev/null now we're ready to accept connections */
        if (dofork) {
                int devnull = open("/dev/null", O_RDWR);
                if (devnull == -1)
                        barf_perror("Could not open /dev/null\n");
+
+               openlog("xenstored", 0, LOG_DAEMON);
+
+               daemonize();
+
+               if (outputpid) {
+                       printf("%ld\n", (long)getpid());
+                       fflush(stdout);
+               }
+
                dup2(devnull, STDIN_FILENO);
                dup2(devnull, STDOUT_FILENO);
                dup2(devnull, STDERR_FILENO);
@@ -1916,6 +1914,9 @@ int main(int argc, char *argv[])
                xprintf = trace;
        }
 
+       if (pidfile)
+               write_pidfile(pidfile);
+
        signal(SIGHUP, trigger_reopen_log);
 
        if (xce_handle != -1)